#!/bin/bash

# =============================================================================
# 应用部署脚本
# =============================================================================

set -e

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'

log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; }
log_warning() { echo -e "${YELLOW}[WARNING]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }

# 项目配置
PROJECT_DIR="/var/www/memebot"
REPO_URL=""  # 用户需要提供

log_info "开始应用部署..."

# 获取项目源码
get_project_source() {
    if [ -n "$REPO_URL" ]; then
        log_info "从Git仓库克隆项目..."
        cd /var/www
        sudo rm -rf memebot
        git clone $REPO_URL memebot
        sudo chown -R $USER:$USER memebot
    else
        log_warning "未提供Git仓库URL"
        log_info "请手动上传项目文件到 $PROJECT_DIR"
        log_info "可以使用以下命令上传："
        echo "  rsync -avz --exclude node_modules /path/to/local/project/ user@server:$PROJECT_DIR/"
        echo "  或使用 scp -r /path/to/local/project/ user@server:$PROJECT_DIR/"
        
        read -p "项目文件是否已上传到 $PROJECT_DIR？(y/N): " -n 1 -r
        echo
        if [[ ! $REPLY =~ ^[Yy]$ ]]; then
            log_error "请先上传项目文件"
            exit 1
        fi
    fi
}

# 检查项目文件
check_project_files() {
    log_info "检查项目文件..."
    
    if [ ! -f "$PROJECT_DIR/package.json" ]; then
        log_error "未找到 package.json 文件"
        exit 1
    fi
    
    if [ ! -f "$PROJECT_DIR/lib/price-server.js" ]; then
        log_error "未找到 lib/price-server.js 文件"
        exit 1
    fi
    
    if [ ! -f "$PROJECT_DIR/prisma/schema.prisma" ]; then
        log_error "未找到 prisma/schema.prisma 文件"
        exit 1
    fi
    
    log_success "项目文件检查通过"
}

# 安装依赖
install_dependencies() {
    log_info "安装项目依赖..."
    cd $PROJECT_DIR
    
    # 清理可能存在的node_modules
    rm -rf node_modules package-lock.json
    
    # 安装依赖
    npm install
    
    log_success "依赖安装完成"
}

# 配置环境变量
setup_environment() {
    log_info "配置环境变量..."
    cd $PROJECT_DIR
    
    # 检查数据库配置文件
    if [ -f "/tmp/db_config.env" ]; then
        source /tmp/db_config.env
        log_info "加载数据库配置"
    else
        log_warning "未找到数据库配置，使用默认配置"
        DATABASE_URL="postgresql://memebot_user:password@localhost:5432/memebot"
    fi
    
    # 创建.env文件
    cat > .env << EOF
# 数据库配置
DATABASE_URL="$DATABASE_URL"

# 区块链RPC节点
SOLANA_RPC_URL="https://api.mainnet-beta.solana.com"
BSC_RPC_URL="https://bsc-dataseed1.binance.org/"
BASE_RPC_URL="https://mainnet.base.org"

# 私钥配置 (⚠️ 请替换为实际私钥)
PRIVATE_KEY="development_mode"

# API密钥 (可选)
COINGECKO_API_KEY=""
DEXSCREENER_API_KEY=""

# 生产环境配置
NODE_ENV="production"
PORT=3000

# WebSocket端口
WS_PORT=3001
EOF
    
    # 设置文件权限
    chmod 600 .env
    chown $USER:$USER .env
    
    log_success "环境变量配置完成"
    log_warning "请编辑 $PROJECT_DIR/.env 文件，配置实际的私钥和API密钥"
}

# 初始化数据库
setup_database() {
    log_info "初始化数据库..."
    cd $PROJECT_DIR
    
    # 生成Prisma客户端
    npx prisma generate
    
    # 推送数据库结构
    npx prisma db push
    
    log_success "数据库初始化完成"
}

# 构建应用
build_application() {
    log_info "构建应用..."
    cd $PROJECT_DIR
    
    # 构建Next.js应用
    npm run build
    
    log_success "应用构建完成"
}

# 创建PM2配置
create_pm2_config() {
    log_info "创建PM2配置..."
    cd $PROJECT_DIR
    
    cat > ecosystem.config.js << EOF
module.exports = {
  apps: [{
    name: 'memebot-trading',
    script: 'lib/price-server.js',
    cwd: '$PROJECT_DIR',
    instances: 1,
    exec_mode: 'fork',
    env: {
      NODE_ENV: 'production',
      PORT: 3000
    },
    log_file: '/var/log/memebot/combined.log',
    out_file: '/var/log/memebot/out.log',
    error_file: '/var/log/memebot/error.log',
    time: true,
    autorestart: true,
    watch: false,
    max_memory_restart: '1G',
    restart_delay: 5000,
    min_uptime: '10s',
    max_restarts: 10
  }]
};
EOF
    
    log_success "PM2配置创建完成"
}

# 主函数
main() {
    # 检查项目目录是否存在
    if [ ! -d "$PROJECT_DIR" ]; then
        sudo mkdir -p $PROJECT_DIR
        sudo chown $USER:$USER $PROJECT_DIR
    fi
    
    # 获取项目源码
    get_project_source
    
    # 检查项目文件
    check_project_files
    
    # 安装依赖
    install_dependencies
    
    # 配置环境变量
    setup_environment
    
    # 初始化数据库
    setup_database
    
    # 构建应用
    build_application
    
    # 创建PM2配置
    create_pm2_config
    
    log_success "应用部署完成！"
    log_info "下一步请运行: ./scripts/04-nginx-config.sh"
}

# 运行主函数
main "$@"
